//
//  VIUUI.h
//  VIU_NSH_UI
//
//  Created by jagger.tu on 2023/3/8.
//  Copyright © 2023 CloudSky All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@class VIUUI;

@protocol VIUUIDelegate <NSObject>

///游戏通知用户退出,必须实现
- (void)kickUserWithVIUUI:(VIUUI *)viu;

@optional

///被结束游戏,由于游玩时间不够 同: STATUS_BALANCE_LOW_GAME_KILLED 状态码
- (void)VIUUI:(VIUUI *)viu gameEndedDueToInsufficientPlayingTime:(NSTimeInterval)time;
///游戏发给app的消息,即外部自定义的
- (void)VIUUI:(VIUUI *)viu otherMsgGame:(NSString *)msg;
///打开浏览器URL, 没有实现则会通知为 STATUS_OPEN_WEB_URL
- (void)VIUUI:(VIUUI *)viu browserUrl:(NSString *)url;
///上传图片,type: 1 为图片, 没有实现则会通知为 STATUS_UPLOAD_IMAGE
- (void)VIUUI:(VIUUI *)viu uploadType:(int)type;
///保存文件,name为文件名, type: 1 图片,2 视频,没有实现则会通知为 STATUS_DOWNLOAD_IMAGE,STATUS_DOWNLOAD_VIDEO
- (void)VIUUI:(VIUUI *)viu saveFileWithName:(NSString *)name type:(int)type;
///游戏请求云游戏地理位置.
///如果实现,将使用外部GPS,不在自动获取位置.需要app主动调用`updateGPSWithLongitude:latitude:`
- (void)requestGPSInfoFromVIUUI:(VIUUI *)viu;
///游戏通知本地震动, vibratioName 震动名称(Seletion | Success | Warning | Failure | LightImpact | MediumImpact | HeavyImpact)
///如果未实现,会提供默认实现.
///如果被实现,将不在自动响应震动信息
- (void)VIUUI:(VIUUI *)viu vibratioName:(NSString *)vibratioName;

///请求麦克风权限|GPS权限,请求gps时,name = @"gps" ,请求麦克风时 name = @"microphone"
///当自动获取位置权限失败时,会调用该方法,一般用户拒绝授权后.应引导用户去系统设置页面开启权限
///注意: 可能回调多次(比如连续收到多个打开gps的游戏消息),如果用户弹框未消失,则应注意不要多次弹框,否则可能有奔溃风险.
///   - bFirst: 代表用户首次确认权限,首次确认权限系统会有弹框.拒绝后下次请求权限bFirst == YES,下次再次请求权限时 bFirst == NO
///   - bLocationServicesEnabled: 代表服务是否开启,例如定位服务总开关,关闭服务器后将无法使用定位功能,在申请权限之前
/// `requestGPSInfoFromVIUUI:`,如果sdk外部实现了这个方法,则不用再处理
- (void)VIUUI:(VIUUI *)viu requestPermissionWithName:(nonnull NSString *)name bFirst:(BOOL)bFirst bLocationServicesEnabled:(BOOL)bLocationServicesEnabled;

@end

@interface VIUUI : NSObject

@property (nonatomic,weak) id<VIUUIDelegate> delegate;

/// YES表示已经 `sendGameMsg`
@property (nonatomic, assign, readonly) BOOL bCanSendGameMsg;

/// 指定渠道名称,默认 ios_micro
@property (nonatomic, strong) NSString *channalName;

@property (nonatomic, strong) NSString *name;
/// 陀螺仪与加速器数据的更新频率,默认是50hz
@property (nonatomic, assign) int monitorUpdateFrequency;


///整个app生命周期只需调用一次
- (void)registerWithName:(NSString *)name;
///移除添加的事件
- (void)unregisterWithName:(NSString *)name;
+ (instancetype)shared;
+ (void)log:(NSString *)log;
/// 发送模板Id
- (void)sendPatternWithId:(NSString *)Id;
/// 主动调用OnStop 时,调用.
- (void)deinit;
/// 上传文件成功完成时,调动这个方法
/// @param file 上传的文件名
/// @param state  0：上传成功；1：上传失败；
- (void)uploadFile:(NSString *)file state:(int)state;
/// 下载完成后调用
/// @param file ...  未使用
/// @param state  0：保存成功；1：取消保存（移动端无此状态）；2：保存失败
- (void)saveFile:(NSString *)file state:(int)state;
/// 发送游戏消息
- (void)sendGameMsg:(NSString *)msg;
///发送位置信息,longitude: 经度, latitude: 纬度
- (void)updateGPSWithLongitude:(float)longitude latitude:(float)latitude;

///仅测试使用: 模拟接收到游戏消息
- (void)testRevGameMessage:(NSString *)message;

@end

NS_ASSUME_NONNULL_END
